문서의 임의 삭제는 제재 대상으로, 문서를 삭제하려면 삭제 토론을 진행해야 합니다. 문서 보기문서 삭제토론 CPU 게이트 (문단 편집) ===== 전공자를 위한 간단한 설명 ===== 설명을 위해 CPU의 정보 처리 방식에 대한 최소한의 지식이 필요하다. 1. CPU 안에는 '레지스터'라는 것이 있다. CPU는 일을 할 때 임시로 숫자를 여기에 적어둔다. 2. 각종 프로그램들은 RAM에 자신이 필요한 정보를 적어둔다. 3. 캐시는 RAM에 비해서 매우 빠르게 정보를 넣었다 뺐다 할 수 있다. RAM에는 여러 칸이 있으며 프로그램은 각 칸의 번호를 바탕으로 RAM에 숫자를 적어넣거나 읽어온다. 호텔을 생각하면 된다. 1번 방에 철수가, 2번 방에 영이가, 3번 방에 민수가 있다. 2번 방에 누가 있는지 알고 싶으면 호텔 데스크에 '2번 방, 누구?' 이렇게 질문하면 데스크는 '영이'라고 답할 것이다. 3번방의 민수를 퇴실시키고 싶다면 '3번 방, 퇴실' 이라고 데스크에 명령하면 된다. 대략 이런 방식으로 프로그램은 RAM에다가 숫자를 저장하거나 읽어내기 위해 CPU에 명령을 내린다. 다만, 이때 RAM은 너무 느리기에 중간에 더 빠른 [[캐시 메모리]]라는 임시저장소를 둔다. 당신이 키보드로 무엇을 입력했는지 훔쳐내려는 해커가 있다고 생각해보자. 키보드로 무엇을 입력했는지 알아내면 은행 거래 비밀번호 등 중요한 정보를 탈취해낼 수 있다. 해커의 목적이 키보드 입력값의 탈취라는 전제 하에 다음의 사항을 생각해 보자. 컴퓨터는 모든 것을 숫자로 처리한다. 가령 [[ASCII]]코드를 전제할 때 컴퓨터는 'a'라는 문자를 97로 이해하고 'b'라는 문자를 98로 이해한다. 우리가 키보드로 'a'를 칠 때, 컴퓨터는 메모리의 100번째 방에 숫자 97을 적어넣는다고 치자. 원칙적으로는 OS의 핵심부분인 커널 이외에는 메모리의 100번 방에 무슨 내용이 들어가 있는지 아무도 알 수 없다. 만약 해커가 100번째 방의 내용을 노리고자 '메모리의 100번째 방을 읽어서 나한테 보내라'라는 명령을 내리면, CPU는 권한 오류로 명령을 거부하게 된다. CPU가 아무한테나 100번째 방의 내용을 보내준다는 것이 가능하다면 비밀번호 등 우리가 키보드로 친 내용들이 유출되기 때문이다. 100번째 방의 내용을 읽어내기 위해 해커는 두 개의 명령을 CPU에게 연속해서 전달한다. 첫 번째는 '메모리의 100번 방에 있는 내용을 레지스터 al로 복사해라' 이며 두 번째는 '1000+al을 계산한 다음 RAM에서 그 방에 있는 숫자를 가져다 줘'이다. 즉 100번 방의 내용 → al → 1000+al을 통해 해커는 100번 방의 내용을 알아내려고 하는 것이다. 만약 1000+al이 1097이라면, 'a'가 97인 점을 이용하여 해커는 키보드에서 'a'가 입력되었다는 것을 알아낼 수 있다. 1000+al이 1098이라면 해커는 'b'가 입력되었다는 것을 알 수 있다. 즉, 해커가 시킨 일을 하기 위해 CPU는 다음의 일을 해야 한다. 1. 100번 방에서 숫자를 꺼낸다. 2. 100번 방에서 꺼낸 숫자를 레지스터 al에 임시로 저장한다. 3. al에 저장된 숫자와 1000을 더한다. (여기에서는 1097로 가정하자.) 4. 3에서 더한 결과에 해당하는 RAM의 숫자를 꺼낸다. (즉, 1097번 방의 자료를 꺼낸다.) 5. 꺼낸 숫자를 해커에게 전달한다. 상기에 서술한대로, 이 일련의 과정들은 권한 오류를 일으킨다. 문제는 CPU의 파이프라인 구조에 있다. 해커가 100번방의 숫자를 꺼내라고 했을 때, CPU는 권한 여부에 상관없이 '''일단 100번 방의 숫자를 꺼낸다'''. 그리고 '''RAM의 1097번 방의 숫자'''도 꺼낸다. 즉, 실제로 CPU는 '''해커가 시킨 일을 다 한다. 단지 보여주지 않을 뿐이다'''. 예전까지는 해커한테 보여주지만 않으면 괜찮다고 생각했기 때문에 이런 방식이 사용되었다.[* 여기에 명령어 디자인의 철학이 반영되있음을 엿볼수 있다. 정상적이라면 1번 명령을 실행하려면 <1번명령 접수> → <1번 명령 권한 체크> → <체크됨-명령 실행|체크 안됨-명령 중지> 라는 순서로 되어야 한다. 하지만 이런식으로 모든 명령에 대하여 권한 체크를 하게 된다면 순차적으로 진행해야하고 그렇게 되면 시간이 늘어지게 된다. 그래서 생각해 낸게 지금의 보안 결점의 핵심이다. <1번명령을 접수> → <1번명령 실행과 동시에 권한 체크> → <체크됨-숫자를 보여줌|체크 안됨-명령 중지> 라는 순서로 되어 읽어 보여줄때 벌써 캐시에(레지스터와 동일하고 읽기/쓰기 가 가장 빠르다.) 불러와 있는 값을 주면 되기에 속도가 빨라진다.] 'CPU가 일을 다 하고 보여주지만 않으니, CPU가 일한 '''흔적'''을 찾아 100번 방의 숫자를 알아내자'라는 것이 멜트다운 버그의 핵심 아이디어이다. 해커는 앞서 간단히 언급한 캐시를 이용한다(캐시는 램보다 속도가 훨씬 빠른 메모리이다.). CPU가 RAM의 1097번 방에 있는 정보를 꺼낼 때, 1097번 방의 정보는 자동으로 캐시에 기록된다. RAM에 있는 정보를 캐시로 베껴 써 두면 나중에 다시 볼 때 이를 빠르게 볼 수 있기 때문이다.[* 자세한 것은 [[메모리 계층 구조]] 참조.] CPU는 해커에게 RAM에서 일껏 1097번 방의 자료를 꺼내오고는 해커에게 보여주지는 않는다. 하지만 어쨌든 1097번 방의 자료를 꺼내왔기에 1097번 방의 정보는 캐시에 들어가 있다. CPU가 RAM을 읽으면 무조건 이 정보는 캐시에 기록되기 때문이다. 이제 해커는 RAM의 1000번 방부터 하나씩 방을 검색하기 시작한다. 1000번 이후의 모든 방들은 캐시에 없기 때문에, 램에서 읽어와야 하므로 읽는 데 시간이 꽤 오래 걸린다. 하지만 1097번 방은 캐시에 있기 때문에, 읽는 데 시간이 적게 걸린다. 해커는 RAM의 1000번 방 이후의 방을 읽을 때마다 읽는 데 걸린 시간을 측정한다. 1097번 방을 읽을 때 시간이 적게 걸리는 것을 잡아내면, 해커는 '''CPU가 나한테 보여주지는 않았지만, 실제로는 1097번 방을 읽었다'''는 것을 알게 된다. 이를 근거로 al에 원래는 97이 들어가야 했다는 것을 알 수 있고 우리가 키보드로 'a'를 쳤다는 것을 알 수 있다.저장 버튼을 클릭하면 당신이 기여한 내용을 CC-BY-NC-SA 2.0 KR으로 배포하고,기여한 문서에 대한 하이퍼링크나 URL을 이용하여 저작자 표시를 하는 것으로 충분하다는 데 동의하는 것입니다.이 동의는 철회할 수 없습니다.캡챠저장미리보기